#!/bin/bash
file_name=functions.sh
funcs=`which $file_name`
if [ "$funcs" != "" ] ;then
  echo "funcs=$funcs"
  . $funcs
else
  funcs=`dirname $0`/$file_name
  echo "$PWD"
  echo "funcs=$funcs"
  if [ "$funcs" != "" ] ;then
    . $funcs
  else
    exit
  fi
fi

export SVN=`which svn.shc`
smartphone=172.20.127.15
svn_log_conf=$HOME/svn-log.ini
rm -f $svn_log_conf
svnlogini_file="http://$smartphone/update/configs/svn-log.ini"
wget -q --no-check-certificate  http://$smartphone/update/configs/svn-log.ini --directory-prefix=$HOME

function ShowHelp()
{
  echoTextRed "本脚本对svn程序进行了封装，针对我们目前的版本库提供查询辅助。
如果没有指定work-copy参数的调用，svn取路径为当前目录，即当前目录就是工作拷贝。
如果需要查版本库上的版本，需要指定url。例如:svn-log.sh http://$smartphone/repositories/AppsOfMtk/trunk/packages-w1140
参数：
	-r		：svn的版本，可以是具体版本，也可以是版本区域。
			  具体版本举例，查询第1000个版本：svn-log.sh -r 1000
			  具体版本举例，查询第1000和第1001两个版本：svn-log.sh -r 1000,1001
			  版本区域举例，查询1000到2000之间的版本：svn-log.sh -r 1000:2000
			  以时间为例，查询2012年1月1日之后的版本：svn-log.sh -r {20120101}
			  以时间为例，查询2012年1月1日至2012年5月5日之间的版本：svn-log.sh -r {20120101}:{20120505}
			  注意：svn命令以时间为查询时，会取给定时间前一天的最后一个版本为结束，也就是说相差一天。
	-u		：查询版本库操作的用户
			  以用户pengfuhui举例，查询pengfuhui上传过的所有版本：svn-log.sh -u pengfuhui
	--help|-help	：显示帮助
其他：
	脚本执行后，会分类保存svn修改记录，如果要查看更详细的信息，请查看这些分类文件
"
}


function sh_get_svn_replace_path()
{
  local work_copy=$1
  local replace=
  if [ -z "$work_copy" ]; then 
    work_copy=`pwd`
  fi
  local src_url=`svn info $work_copy| sed -n '2p' |awk '{print $2}'`
  local repo_url=`svn info $work_copy|sed -n '3p' |awk '{print $2}'`
  replace=`echo $src_url|sed "s@$repo_url@@g"`
  echo "$replace"
}

function sh_get_svn_repo_import_no()
{
  local work_copy=$1
  local l_replace=
  local result=
  local import_no=
  l_replace=`sh_get_svn_replace_path $work_copy`
  if test -f $svn_log_conf; then
    while read  path  version info; do
      if [ -z "$path" ] || [ -z "$version" ]; then
        continue
      fi
      result=`echo $l_replace |grep $path`
      if [ -n "$result" ]; then
        import_no=$version
        break
      fi
    done < $svn_log_conf
  fi
  echo "$import_no"
}

function parse_svn_log_by_no() 
{
  local f_in=$1
  local l_keyword=$2
  local f_out=$3
  local f_tmp=$log_f_dir/${USER}-svn-log-tmp2.txt
  local l_name=
  local l_replace=`sh_get_svn_replace_path`
  #echo "cat $f_in |grep ^r$l_keyword |awk '{print $3}'"
  l_name=`cat $f_in |grep ^r$l_keyword -w |awk '{print $3}'`
  l_date=`cat $f_in |grep ^r$l_keyword -w |awk '{print $5}'|tr -d '-'`
  cat $f_in | sed -n "/r$l_keyword/,/----/p" |grep M -w >$f_tmp
  cat $f_in | sed -n "/r$l_keyword/,/----/p" |grep A -w >>$f_tmp
  cat $f_in | sed -n "/r$l_keyword/,/----/p" |grep D -w >>$f_tmp
  #echo "cat $f_tmp  | sed \"s#^#  $l_date#\" | sed \"s#^#  $l_keyword#\" |sed \"s#^#$l_name#\" | sed "s#$l_replace/##g" | tee $f_out"
  cat $f_tmp  | sed "s#^#  $l_date#" | sed "s#^#  $l_keyword#" |sed "s#^#$l_name#" | sed "s#$l_replace/##g" > $f_out
}

function get_svn_log_v() 
{
  local work_copy=$1
  local version=$3
  local l_versions=
  local f_out=$2
  local f_tmp=$log_f_dir/${USER}-svn-log-tmp2.txt
  local result=
  rm -rf $f_out; touch $f_out
  if [ -n "$version" ]; then
    start_v=`echo "$version" | awk -F':' '{print $1}'`
    end_v=`echo "$version" | awk -F':' '{print $2}'`
  else
    start_v=`sh_get_svn_repo_import_no $work_copy`
    end_v=head
  fi
  echo "start_v=$start_v end_v=$end_v"
  if [ -n "$start_v" ] && [ -n "$end_v" ]; then
    #echo "${SVN} log $work_copy  -r $start_v:$end_v -v > $f_out --stop-on-copy"
    ${SVN} log $work_copy  -r $start_v:$end_v -v > $f_out --stop-on-copy
  else
    if [ -n "$start_v" ]; then
      result=`echo "$start_v" | grep ','`
      if [ -n "$result" ]; then
        l_versions="$result"
      fi
      end_v=$start_v
    else
      start_v=`sh_get_svn_repo_import_no $work_copy`
      if [ -z "$start_v" ]; then
        echoTextRed "获取工作副本 $work_copy 初始版号失败!!"
        return
      fi
      if [ -z "$end_v" ]; then
        end_v=$start_v
      fi
    fi  
    
    if [ -n "$l_versions" ]; then
      l_versions="`echo $l_versions | tr ',' ' '`"
      for v in $l_versions
      do
        #echo "${SVN} log $work_copy  -r $v -v > $f_tmp --stop-on-copy"
        if IsNumeric $v || [ "$v" = "head" ] || [ "$v" = "committed" ]; then
          ${SVN} log $work_copy  -r $v -v > $f_tmp --stop-on-copy
          cat $f_tmp>>$f_out
        else
           echoTextRed "v=$v svn版本号必须为数字"
        fi
      done     
    else
      ${SVN} log $work_copy  -r $start_v:$end_v -v > $f_out --stop-on-copy
    fi
  fi
}


function parse_svn_log_by_author()
{
  local f_in=$1
  local l_keyword=$2
  local f_out=$3
  local f_tmp=$log_f_dir/${USER}-svn-log-tmp3.txt
  cat $f_in | sed -n "/$l_keyword/,/----/p" >$f_out
}

function parse_svn_log() 
{
  local f_in=$1
  local f_out=$2
  local l_keyword=$3
  local f_tmp=$log_f_dir/${USER}-svn-log-tmp1.txt
  local l_name=
  local l_version=
  local f_in2=`echo $f_in|sed "s/.txt//g"`-${l_keyword}.txt  
  if [ -z "$l_keyword" ]; then
      l_version=`cat $f_in | grep -E "+[0-9][0-9]" | grep ^r |awk '{print $1}'|tr -d 'r'` 
  else
    if IsNumeric $l_keyword;then
      l_version=$l_keyword
      l_name=`cat $f_in |grep ^r|grep $l_keyword -w|awk '{print $3}'`
    else
      l_name=$l_keyword
      l_version=`cat $f_in |grep ^r |grep  $l_keyword -w |awk '{print $1}'|tr -d 'r'`   
      parse_svn_log_by_author $f_in  $l_keyword $log_f_V
    fi
  fi

  rm $f_tmp -rf; touch $f_tmp
  rm $f_out -rf; touch $f_out
  for v in $l_version
  do
    parse_svn_log_by_no $f_in $v $f_tmp  #单个版本的log
    cat $f_tmp>>$f_out
  done
}


#脚本入口
while test $# != 0
do
    case $1 in
 	-m)
	    shift
	    mode=$1
	    ;; 
	-r)
	    shift
	    version=$1
	    ;; 
	-u)
	    shift
	    author=$1
	    ;; 
	--help|-help)
	    ShowHelp
	    exit
	    ;;
        *)
	   work_copy=$1
	   ;;
       esac
       shift
done

if [ "$mode" = "qaat" ]; then
  grep.sh . FATAL |grep EXCEPTION |awk -F":" '{print $1}' |sort |uniq
  java -jar /usr/local/bin/backup/QAAT-ProGuard.jar
  exit
fi



SVNCMD=`which svn`
if [ -z "$work_copy" ]; then
  work_copy=`pwd`
  if test ! -d $work_copy/.svn; then
    echoTextRed "$work_copy 不是工作副本!!"
    exit
  fi
fi

log_f_dir=$HOME/svnlog
rm -rf $log_f_dir
mkdir -p $log_f_dir
log_f_V_all=$log_f_dir/${USER}-svn-log-v-all.txt
if [ -n "$author" ]; then
log_f_V=$log_f_dir/${USER}-svn-log-v-${author}.txt
log_f_M=$log_f_dir/${USER}-svn-log-m-${author}.txt
log_f_A=$log_f_dir/${USER}-svn-log-a-${author}.txt
log_f_D=$log_f_dir/${USER}-svn-log-d-${author}.txt
log_f_MAD=$log_f_dir/${USER}-svn-log-mad-${author}.txt
log_f_all=$log_f_dir/${USER}-svn-log-files-${author}.txt
else
log_f_V=$log_f_dir/${USER}-svn-log-v.txt
log_f_M=$log_f_dir/${USER}-svn-log-m.txt
log_f_A=$log_f_dir/${USER}-svn-log-a.txt
log_f_D=$log_f_dir/${USER}-svn-log-d.txt
log_f_MAD=$log_f_dir/${USER}-svn-log-mad.txt
log_f_all=$log_f_dir/${USER}-svn-log-files.txt
fi

#-v选项 获取svn log
echo "get_svn_log_v $work_copy $log_f_V_all "$version""
get_svn_log_v $work_copy $log_f_V_all "$version"
#${SVN} log $work_copy  -r $version -v > $log_f_V_all
parse_svn_log $log_f_V_all  $log_f_MAD $author

cat $log_f_MAD | awk '{print $5}' | sort | uniq > $log_f_all
cat $log_f_MAD | grep M -w  > $log_f_M
cat $log_f_MAD | grep A -w  > $log_f_A
cat $log_f_MAD | grep D -w  > $log_f_D
echoTextBlue  "分类保存svn修改记录:"
echoTextGreen "$log_f_V_all 原始log信息
$log_f_V $author 原始log信息
-----------------
$log_f_M 修改的文件
$log_f_A 添加的文件
$log_f_D 删除的文件
$log_f_MAD 所有文件
$log_f_all 文件列表"
